package com.interview.pool;

/**
 * 简单的交替输出奇偶数示例（不使用线程池）
 * 
 * 功能说明：
 * - 创建两个普通线程
 * - 线程1 输出所有奇数（1, 3, 5, ..., 99）
 * - 线程2 输出所有偶数（2, 4, 6, ..., 100）
 * - 通过 wait/notify 机制确保输出顺序严格按照数字大小递增
 * - 输出结果：1, 2, 3, 4, 5, ..., 98, 99, 100
 * 
 * @author Interview
 * @version 1.0
 */
public class SimpleAlternateNumberPrinter {
    
    /**
     * 共享资源类：管理奇偶数的输出状态
     */
    static class Printer {
        // 当前应该输出的数字
        private int currentNumber = 1;
        
        // 最大数字
        private static final int MAX_NUMBER = 100;
        
        /**
         * 输出奇数的方法
         */
        public synchronized void printOdd() {
            while (currentNumber <= MAX_NUMBER) {
                // 如果当前数字是奇数，输出它
                if (currentNumber % 2 == 1) {
                    System.out.print(currentNumber + " ");
                    currentNumber++;
                    // 唤醒等待的线程（偶数线程）
                    notifyAll();
                } else {
                    // 当前数字是偶数，等待偶数线程处理
                    try {
                        wait();
                    } catch (InterruptedException e) {
                        Thread.currentThread().interrupt();
                        break;
                    }
                }
            }
        }
        
        /**
         * 输出偶数的方法
         */
        public synchronized void printEven() {
            while (currentNumber <= MAX_NUMBER) {
                // 如果当前数字是偶数，输出它
                if (currentNumber % 2 == 0) {
                    System.out.print(currentNumber + " ");
                    currentNumber++;
                    // 唤醒等待的线程（奇数线程）
                    notifyAll();
                } else {
                    // 当前数字是奇数，等待奇数线程处理
                    try {
                        wait();
                    } catch (InterruptedException e) {
                        Thread.currentThread().interrupt();
                        break;
                    }
                }
            }
        }
    }
    
    /**
     * 主方法：演示两个线程协作输出奇偶数
     */
    public static void main(String[] args) throws InterruptedException {
        System.out.println("========== 简单线程协作输出奇偶数示例 ==========\n");
        System.out.println("预期输出：1 2 3 4 5 ... 98 99 100\n");
        System.out.println("实际输出：");
        
        // 创建共享的 Printer 对象
        Printer printer = new Printer();
        
        // 创建奇数线程
        Thread oddThread = new Thread(() -> {
            printer.printOdd();
        }, "OddThread");
        
        // 创建偶数线程
        Thread evenThread = new Thread(() -> {
            printer.printEven();
        }, "EvenThread");
        
        // 启动两个线程
        oddThread.start();
        evenThread.start();
        
        // 等待两个线程执行完毕
        oddThread.join();
        evenThread.join();
        
        System.out.println("\n\n========== 程序执行完毕 ==========");
    }
}

